#include <iostream>

using namespace std;

/*
 * 类模板
 *  语法  template<class T>
 *       类
 *  注：  1、类模板没有自动类型推导的方式
 *       2、类模板在模板参数列表中可以有默认参数
 */

// 姓名和年龄是两个不同的类型，故声明两个
template<class NameType, class AgeType=int>  // 模板参数列表中有默认参数，指定AgeType为int类型，调用时可以不用显示指定AgeType类型
class Person{
public:
    Person(NameType name, AgeType age){
        this->p_name = name;
        this->p_age = age;
    }
    NameType p_name;
    AgeType p_age;
};

void test01(){
    Person<string, int>p1("test", 18);  //没有自动类型推导的方式,调用得显示指定类型

    Person<string>p2("test", 18);  //模板参数列表中有默认参数，指定AgeType为int类型，调用时可以不用显示指定AgeType类型
    cout<<"name="<<p1.p_name <<", age="<<p1.p_age<<endl;
}

int main() {

    test01();

    return 0;
}
